package com.cleanvegetable.mq;

import com.cleanvegetable.company.entity.Company;
import com.cleanvegetable.config.RabbitMQConfig;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 公司信息消息消费者
 * @author cleanvegetable
 */
@Slf4j
@Component
public class CompanyConsumer {

    /**
     * 处理财务系统同步消息
     */
    @RabbitListener(queues = RabbitMQConfig.COMPANY_FINANCE_QUEUE)
    public void handleFinanceSync(CompanyMessage companyMessage, Message message, Channel channel) {
        // 获取消息的标识
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        
        try {
            Company company = companyMessage.getCompany();
            String operationType = companyMessage.getOperationType();
            
            log.info("收到财务系统同步消息，公司ID：{}，操作类型：{}", company.getId(), operationType);
            
            // 根据操作类型处理不同的同步逻辑
            switch (operationType) {
                case "create":
                    syncToFinanceSystem(company);
                    break;
                case "update":
                    updateFinanceSystem(company);
                    break;
                case "delete":
                    deleteFromFinanceSystem(company);
                    break;
                default:
                    log.warn("未知的操作类型：{}", operationType);
            }
            
            // 手动确认消息
            channel.basicAck(deliveryTag, false);
            log.info("财务系统同步完成，公司ID：{}", company.getId());
        } catch (Exception e) {
            try {
                // 处理失败，拒绝消息，并重新入队
                channel.basicNack(deliveryTag, false, true);
                log.error("财务系统同步失败，错误信息：{}", e.getMessage());
            } catch (Exception ex) {
                log.error("消息拒绝失败", ex);
            }
        }
    }

    /**
     * 处理通知消息
     */
    @RabbitListener(queues = RabbitMQConfig.COMPANY_NOTIFY_QUEUE)
    public void handleNotify(CompanyMessage companyMessage, Message message, Channel channel) {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        
        try {
            Company company = companyMessage.getCompany();
            String operationType = companyMessage.getOperationType();
            
            log.info("收到公司信息变更通知消息，公司ID：{}，操作类型：{}", company.getId(), operationType);
            
            // 发送通知（这里模拟发送通知）
            sendNotification(company, operationType);
            
            // 手动确认消息
            channel.basicAck(deliveryTag, false);
            log.info("通知发送完成，公司ID：{}", company.getId());
        } catch (Exception e) {
            try {
                channel.basicNack(deliveryTag, false, true);
                log.error("通知发送失败，错误信息：{}", e.getMessage());
            } catch (Exception ex) {
                log.error("消息拒绝失败", ex);
            }
        }
    }

    /**
     * 处理日志记录消息
     */
    @RabbitListener(queues = RabbitMQConfig.COMPANY_LOG_QUEUE)
    public void handleLog(CompanyMessage companyMessage, Message message, Channel channel) {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        
        try {
            Company company = companyMessage.getCompany();
            String operationType = companyMessage.getOperationType();
            
            log.info("收到公司信息变更日志消息，公司ID：{}，操作类型：{}", company.getId(), operationType);
            
            // 记录操作日志（这里模拟记录日志）
            saveOperationLog(company, operationType);
            
            // 手动确认消息
            channel.basicAck(deliveryTag, false);
            log.info("日志记录完成，公司ID：{}", company.getId());
        } catch (Exception e) {
            try {
                channel.basicNack(deliveryTag, false, true);
                log.error("日志记录失败，错误信息：{}", e.getMessage());
            } catch (Exception ex) {
                log.error("消息拒绝失败", ex);
            }
        }
    }

    /**
     * 同步到财务系统（模拟）
     */
    private void syncToFinanceSystem(Company company) {
        // 模拟同步处理
        log.info("同步公司信息到财务系统：{}", company.getCompanyName());
    }

    /**
     * 更新财务系统信息（模拟）
     */
    private void updateFinanceSystem(Company company) {
        // 模拟更新处理
        log.info("更新财务系统公司信息：{}", company.getCompanyName());
    }

    /**
     * 从财务系统删除（模拟）
     */
    private void deleteFromFinanceSystem(Company company) {
        // 模拟删除处理
        log.info("从财务系统删除公司信息：{}", company.getCompanyName());
    }

    /**
     * 发送通知（模拟）
     */
    private void sendNotification(Company company, String operationType) {
        // 模拟发送通知
        log.info("发送公司信息变更通知：{}，操作类型：{}", company.getCompanyName(), operationType);
    }

    /**
     * 保存操作日志（模拟）
     */
    private void saveOperationLog(Company company, String operationType) {
        // 模拟保存日志
        log.info("记录公司信息变更日志：{}，操作类型：{}", company.getCompanyName(), operationType);
    }
} 